package com.itheima.ui;

import javax.swing.*;
import javax.swing.border.BevelBorder;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Random;

public class GameJFrame extends JFrame implements KeyListener, ActionListener {

    int[][] data=new int[4][4];
    int x;//用于每次记录数字0的位置
    int y;
   String path="01\\image\\girl\\girl6\\";//当想要修改路径也就是图片种类时直接在这里修改
   int[][] win={{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,0}};
   int step=0;//初始值为0

    //创建菜单下的条目
    JMenuItem replayItem=new JMenuItem("重新游戏");
    JMenuItem reLoginItem=new JMenuItem("重新登录");
    JMenuItem closeItem=new JMenuItem("关闭游戏");
    JMenuItem accountItem=new JMenuItem("公众号");
    JMenuItem girlItem=new JMenuItem("美女");
    JMenuItem AnimalItem=new JMenuItem("动物");
    JMenuItem SportItem=new JMenuItem("运动");

    //构造方法定义窗口
    public GameJFrame()
    {   //设置基础界面信息
        initJFrame();
        //设置菜单
        initJMenuBar();
        //初始化数据
        initdata();
        //设置界面上的拼图
        initImage();

        //显示窗口
        this.setVisible(true);
    }

    //定义一个方法判断当前游戏是否胜利
    public boolean victory()
    {
        //要判断胜利，就是将数组进行比对
        for (int i=0;i< data.length;i++)
        {
            for(int j=0;j<data[i].length;j++)
            {
                if(win[i][j]!=data[i][j])
                    return false;//有一块拼图不对就失败
            }
        }
        return true;
    }
   private void initdata()
   {
       Random r=new Random();

       int[] tempArr={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};//代表十六章图片
       //打乱一维数组中数字的顺序
       for (int i = 0; i < tempArr.length ; i++) {
           int index=r.nextInt(16);
           int temp=tempArr[index];
           tempArr[index]=tempArr[i];
           tempArr[i]=temp;
       }
       for (int j = 0; j < tempArr.length; j++) {
         if(tempArr[j]==0)
         {
             x=j/4;
             y=j%4;
         }
             data[j / 4][j % 4] = tempArr[j];
       }
   }
    private void initImage() {
        //先清除之前的图片
        this.getContentPane().removeAll();
       //每次都判断是否胜利,并加载图片
        if(victory())
        {
            JLabel jLabel=new JLabel(new ImageIcon("D:\\JavaCode\\PROJECT\\PuzzleGame\\01\\image\\win.png"));
            jLabel.setBounds(203,283,197,73);
        this.getContentPane().add(jLabel);
        }

      // 做步数更新
     //jlabel可以用于管理文字
        JLabel stepCount=new JLabel("步数："+step);
        stepCount.setBounds(50,30,100,20);
        this.getContentPane().add(stepCount);


        for (int j=0;j<4;j++) {
            for (int i=0;i<4;i++) {
                //2.添加图片，创建管理图片和文字的对象，本质是容器
                int number=data[j][i];
                JLabel jLabel=new JLabel(new ImageIcon(path+number+".jpg"));
                //重新设置图片的位置
                jLabel.setBounds(105*i+83,105*j+134,105,105);//图片的位置由左上角点决定
                //给图片设置边框
                jLabel.setBorder(new BevelBorder(1));
                //将管理容器添加到界面中--getContPane表示获取当前这个隐形的容器
                this.getContentPane().add(jLabel);

            }
        }


        //后加载的图片会放在下方
        JLabel background=new JLabel(new ImageIcon("01\\image\\background.png"));
        background.setBounds(40,40,508,560);
        this.getContentPane().add(background);

         //实现内容的更新
        this.getContentPane().repaint();
    }

    private void initJMenuBar() {
        //创建菜单整个对象
        JMenuBar jMenuBar=new JMenuBar();
        //定义菜单的大小
        //jMenuBar.setSize(514,20);
        //创建菜单选项
        JMenu jMenu1=new JMenu("功能");
        JMenu jMenu2=new JMenu("关于我们");
        JMenu jMenu3=new JMenu("更换图片");
        //添加条目：美女，动物，运动


        //将对应条目放在菜单下
        jMenu1.add(jMenu3);
        jMenu1.add(replayItem);
        jMenu1.add(reLoginItem);
        jMenu1.add(closeItem);
        jMenu2.add(accountItem);
        jMenu3.add(girlItem);
        jMenu3.add(AnimalItem);
        jMenu3.add(SportItem);

        //给各个条目添加点击事件
        replayItem.addActionListener(this);
        reLoginItem.addActionListener(this);
        closeItem.addActionListener(this);
        accountItem.addActionListener(this);
        girlItem.addActionListener(this);
        AnimalItem.addActionListener(this);
        SportItem.addActionListener(this);


        //将菜单放入菜单对象中

        jMenuBar.add(jMenu1);
        jMenuBar.add(jMenu2);

        //将菜单放入窗体
        this.setJMenuBar(jMenuBar);


    }

    private void initJFrame() {
        this.setSize(603,680);
        //设置界面的标题
        this.setTitle("拼图单机版 v1.8");
        //设置界面置顶
        this.setAlwaysOnTop(true);
        //设置界面居中
        this.setLocationRelativeTo(null);
        //设置关闭模式
        this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        //取消默认的居中存放
        this.setLayout(null);
       //在整个界 面实现监听事件
        this.addKeyListener(this);//在本类中调用他的重写方法
        this.setVisible(true);

    }

    @Override
    public void keyTyped(KeyEvent e) {

    }

    @Override
    public void keyPressed(KeyEvent e) {
   //表示按下键盘，这里实现按下A能够展示完整图片的功能
        int code=e.getKeyCode();

        if(code==65)//表示A
        {
            //删除原有的图片
            this.getContentPane().removeAll();
            //重新加载拼图图片和背景图片，再次刷新
            JLabel jLabel=new JLabel(new ImageIcon(path+"all.jpg"));
            jLabel.setBounds(83,134,420,420);
            this.getContentPane().add(jLabel);
            //后加载的图片会放在下方
            JLabel background=new JLabel(new ImageIcon("01\\image\\background.png"));
            background.setBounds(40,40,508,560);
            this.getContentPane().add(background);

            //实现内容的更新
            this.getContentPane().repaint();
        }

    }

    @Override
    public void keyReleased(KeyEvent e) {

        if(victory())
        return;//游戏胜利以后就不可以移动图片了



        //表示当键盘按下的时候实现拼图的移动
    int code=e.getKeyCode();
        //获取当前键盘按下的参数是左上右下的哪一个，根据不同方向实现不同
      if(code==37)//左
      {
          System.out.println("向左移动");
          if(y==3)
              return;
          //将0右边的数字移动到0的位置
          data[x][y]=data[x][y+1];
          data[x][++y]=0;
          initImage();//重新生成图片
         step++;
      }else if(code==38)//上
      {
          System.out.println("向上移动");
          if(x==3)//如果0在最底层就不做操作
              return;
        //将0下方的数字移动到0的位置
          data[x][y]=data[x+1][y];
          data[++x][y]=0;
          initImage();
          step++;
      }else if(code==39)//右
      {
          System.out.println("向右移动");
          //将数字0左边的数字移动到0上
          if(y==0)
              return;
          data[x][y]=data[x][y-1];
          data[x][--y]=0;
          initImage();
          step++;
      }else if(code==40)//下
      {
          System.out.println("向下移动");
          if(x==0)
              return ;
          data[x][y]=data[x-1][y];
          data[--x][y]=0;
          initImage();
          step++;
      }else if(code==65) {
          //当按下A的键盘松开就要恢复随即图片
          initImage();
      }else if(code==87)//在按下的时候实现作弊
      {
          data= new int[][]{{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,0}};
          initImage();
      }
    }

    @Override
    public void actionPerformed(ActionEvent e)
    {

        //实现堆各个条目点击后的功能
        Object obj = e.getSource();
        if (obj == replayItem) {
            System.out.println("重新游戏");
            //对许多数据实现初始化
            step = 0;//步数初始化
            initdata();//重新打乱数据
            initImage();//重新生成拼图

        } else if (obj == reLoginItem) {
            System.out.println("重新登陆");
            this.setVisible(false);
            new LoginJFrame();

        } else if (obj == closeItem) {
            System.out.println("退出游戏");
            System.exit(0);

        } else if (obj == accountItem) {
            System.out.println("公众号");
            JDialog jDialog = new JDialog();
            JLabel jLabel = new JLabel(new ImageIcon("D:\\JavaCode\\PROJECT\\PuzzleGame\\01\\image\\about.png"));
            jLabel.setBounds(0, 0, 258, 258);
            jLabel.setBounds(0, 0, 258, 258);
            //把图片添加到弹框当中
            jDialog.getContentPane().add(jLabel);
            //给弹框设置大小
            jDialog.setSize(344, 344);
            //让弹框置顶
            jDialog.setAlwaysOnTop(true);
            //让弹框居中
            jDialog.setLocationRelativeTo(null);
            //弹框不关闭则无法操作下面的界面
            jDialog.setModal(true);
            //让弹框显示出来
            jDialog.setVisible(true);
        }else if(obj==girlItem)
        {
//            随机选择图片,有13组美女
            Random r=new Random();
            int[] arr={1,2,3,4,5,6,7,8,9,10,11,12,13};//一共13个数，对应下标0-12
            int index=r.nextInt(13);//得到0-12
            int num1=arr[index];//获得数组上的数字，也就是图片的序号
            path="01\\image\\girl\\girl"+num1+"\\";
            //将新的图片生成
            step=0;
            initdata();
            initImage();

        }else if(obj==AnimalItem)
        {
            Random r=new Random();
            int[] arr={1,2,3,4,5,6,7,8};//一共13个数，对应下标0-12
            int index=r.nextInt(8);//得到0-12
            int num1=arr[index];//获得数组上的数字，也就是图片的序号
            path="01\\image\\animal\\animal"+num1+"\\";
            //将新的图片生成
            step=0;
            initdata();
            initImage();
        }else if(obj==SportItem)
        {
            Random r=new Random();
            int[] arr={1,2,3,4,5,6,7,8,9,10};//一共13个数，对应下标0-12
            int index=r.nextInt(10);//得到0-12
            int num1=arr[index];//获得数组上的数字，也就是图片的序号
            path="01\\image\\sport\\sport"+num1+"\\";
            //将新的图片生成
            step=0;
            initdata();
            initImage();
        }



    }

}
